package com.atguigu.gmall.weball.controller;

import com.atguigu.gamll.feign.cart.CartFeignClient;
import com.atguigu.gmall.product.entity.SkuInfo;
import feign.Request;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;

import javax.annotation.Resource;

/**
 * @author lhh
 * @ClassName CartController
 * @date 2022 2022/12/16
 */
@Controller
public class CartController {

    @Resource
    CartFeignClient cartFeignClient;

    //public static final Map<Thread, HttpServletRequest> map =new ConcurrentHashMap<>();
    /**
     * 同一个线程共享数据用 ThreadLocal： 防止OOM：
     * 1、强： var = 对象； 只要 var!=null，就不会回收
     * 2、弱： WeakReference： 崩的前一刻回收
     *     JVM发现马上要OOM了，就会优先回收掉WeakReference包装的东西
     * 3、软： SoftReference：只要下次发送gc就直接回收掉；
     * 4、虚： 纯粹就是无引用
     */
    //同一个线程共享数据 底层也是一个map
    //private ThreadLocal<HttpServerRequest> threadLocal=new ThreadLocal<>();

    //http://cart.gmall.com/addCart.html?skuId=49&skuNum=1
    @GetMapping("addCart.html")
    public String addToCart(@RequestParam("skuId")Long skuId,
                            @RequestParam("skuNum")Integer num,
                            Model model){
        //把商品添加购物车  远程调用购物车服务
        //远程调用购物车  OOM；
        //List、Map、Set容器类。一定要想清楚，容器里面的数据什么时候放，一定要有删。
        //map.put(Thread.currentThread(),request);
        //threadLocal.set(request);
        Request.Options options=new Request.Options(5000,5000);
        SkuInfo skuInfo = cartFeignClient.addToCart(skuId, num,options).getData();
        model.addAttribute("skuInfo",skuInfo);
        model.addAttribute("skuNum",num);
        //移除线程
        //map.remove(Thread.currentThread());

        //threadLocal.remove();
        return "cart/addCart";
    }

    @GetMapping("cart.html")
    public String getCartList(){
        return "cart/index";
    }

    /**
     * 删除选择的商品
     */
    @GetMapping("cart/deleteChecked")
    public String deleteChecked(){
        //远程调用
        cartFeignClient.deleteChecked();
        return "redirect:http://cart.gmall.com/cart.html";
    }
}
